import { PipeTransform, Injectable, BadRequestException } from '@nestjs/common';

@Injectable()
export class FileValidationPipe implements PipeTransform {
  // 允许的文件类型
  private allowedMimeTypes = [
    'image/jpeg',
    'image/png',
    'image/gif',
    'image/webp',
  ];

  // 最大文件大小（5MB）
  private maxFileSize = 5 * 1024 * 1024;

  transform(files: Express.Multer.File | Express.Multer.File[]) {
    // 处理多文件情况
    if (Array.isArray(files)) {
      // 检查是否有文件被上传
      if (files.length === 0) {
        throw new BadRequestException('请至少上传一个文件');
      }

      // 逐个验证文件
      files.forEach((file) => this.validateSingleFile(file));
      return files;
    }
    // 处理单文件情况
    else {
      this.validateSingleFile(files);
      return files;
    }
  }

  // 单个文件的验证逻辑
  private validateSingleFile(file: Express.Multer.File) {
    // 检查文件是否存在
    if (!file) {
      throw new BadRequestException('请上传文件');
    }

    // 验证文件类型
    if (!this.allowedMimeTypes.includes(file.mimetype)) {
      throw new BadRequestException(
        `不支持的文件类型 ${file.mimetype}。允许的类型：${this.allowedMimeTypes.join(', ')}`,
      );
    }

    // 验证文件大小
    if (file.size > this.maxFileSize) {
      throw new BadRequestException(
        `文件 ${file.originalname} 大小超过限制（${file.size / (1024 * 1024)}MB）。最大允许 ${this.maxFileSize / (1024 * 1024)}MB`,
      );
    }
  }
}
